﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GmUiModelFamily.h"
#include "ModelViewEnums.h"
#include "Vector3d.h"

namespace gcmp
{
    /// \brief 族缩略图导出配置
    struct GM_UI_MODEL_FAMILY_EXPORT ThumbnailExportOptions
    {
        unsigned int Width; ///< 缩略图宽度
        unsigned int Height; ///< 缩略图高度
        std::wstring OutputFilePath; ///< 族缩略图完整输出路径
        std::wstring FamilyTypeName; ///< 族类型的名称
        Vector3d CameraDirection; ///< 相机方向
        ModelViewDisplayOptions DisplayOptions; ///< 视图显示配置
        ModelViewDisplayMode DisplayMode;  ///< 视图显示模式
        ModelViewDetailLevel DisplayDetailLevel;  ///< 视图显示详细程度
        bool IsSetBackGroundColor = false;  ///< 是否设置背景色
        Color BackGroundColor;    ///< 背景色
    };

    /// \brief 族文件缩略图接口类。
    /// 
    /// 用于从族文件中获取族类型和导出缩略图
    class GM_UI_MODEL_FAMILY_EXPORT IFamilyThumbnail
    {
    public:
        /// \brief 创建族文件缩略图接口类实例。
        ///
        /// \param filePath 族文件完整路径
        /// \return 成功返回创建的族文件缩略图接口类实例，失败返回空。
        ///  
        ///  无法成功族文件缩略图接口类实例的原因:
        ///  1.族文件无法正常打开。
        static OwnerPtr<IFamilyThumbnail> Create(const std::wstring& filePath);

        /// \brief 获取族文件中的类型名称列表。
        ///
        /// \return 族文件中的类型名称列表。无法获取时，返回空列表。
        virtual const std::vector<std::wstring>& GetFamilyTypeNames() const = 0;

        /// \brief 创建族文件的缩略图。
        ///
        /// 缩略图宽度限值为10000，超过此限值时会以宽度限值生成缩略图；
        /// 缩略图高度限制为10000，超过此限值时会以高度限值生成缩略图。
        ///
        /// \return 是否成功创建缩略图。
        /// 
        /// 无法成功创建缩略图的原因：
        /// 1.无法获取族文件中的族类型；
        /// 2.传入的导出配置参数不合理。
        virtual bool CreateThumbnail(const ThumbnailExportOptions& options) const = 0;

        /// \brief 获取构件是否包含三维形体信息。
        ///
        /// \return 包含三维形体返回true， 否则返回false
        virtual bool Has3DForm() const = 0;
      
        /// \brief 构件不包含三维形体时，创建族文件基础平面视图下的缩略图。
        ///
        /// \param outputFilePath 族缩略图完整输出路径
        /// \param familyTypeName 族类型的名称
        /// \param width 缩略图的宽度
        /// \param height 缩略图的高度
        /// \param isSetBackGroundColor 是否设置背景色，默认false
        /// \param backGroundColor 背景色，默认为浅色背景色 
        /// \return 是否成功创建缩略图。
        virtual bool CreatePlanViewThumbnail(std::wstring outputFilePath, std::wstring familyTypeName, int width, int height, bool isSetBackGroundColor = false, const Color& backGroundColor = Color(230, 229, 227, 255))const = 0;

        /// \brief 获取构件的视图信息
        ///
        /// \return 文档中各视图的Name及其ElementId
        virtual const std::map<std::wstring, gcmp::ElementId> GetModelViewContent()const = 0;

        /// \brief 构件视图中是否包含可见的二维线或二维嵌套族
        ///
        /// 支持三维视图，视图方向与X轴、Y轴、Z轴平行的视图（如基础标高视图及前后左右视图）；若是其他视图（如剖面图），且族中包含二维线或二维嵌套族，不检查其可见性，直接返回ture
        /// 例：可配合CreatePlanViewThumbnail(……)使用，当基础标高视图下无3D形体，但有可见二维线或二维图例情况下进行截图，此时modelViewId为基础标高视图ElementId
        ///
        /// \param modelViewId 视图ElementId
        /// \return 包含可见的二维线或二维嵌套族返回true， 否则返回false
        virtual bool HasVisible2DElementInModelView(const gcmp::ElementId& modelViewId)const = 0;

        /// \brief 析构函数
        virtual ~IFamilyThumbnail();
    };
}

